Code to Set Up our CSV file
The code in this chunk below sums up all the cases for countries that are broken into regions so we can have one value per row for those countries. We had to do this for the US, China, and Australia.
virus = read_csv("covid_19_clean_complete.csv")
Parsed with column specification:
cols(
Province_State = [31mcol_character()[39m,
Country_Region = [31mcol_character()[39m,
Lat = [32mcol_double()[39m,
Long = [32mcol_double()[39m,
Date = [31mcol_character()[39m,
Confirmed = [32mcol_double()[39m,
Deaths = [32mcol_double()[39m,
Recovered = [32mcol_double()[39m
)
virus <- replace.value(virus,"Country_Region",from = "US",to = "United States") #Replacing value of US with value United States
#US_virus is the data with the cruise ships filtered out and sums up all the cases in each county and combines them into a total number of cases grouped by date
#No_US_virus is the data without the US and is just for all the other countries
#country_virus is the final dataset grouped by country
#US_virus = virus %>% filter(Country_Region == "US") %>% filter(Province_State != "Grand Princess Cruise Ship",Province_State != "Omaha, NE (From Diamond Princess)",Province_State != "Travis, CA (From Diamond Princess)",Province_State != "Lackland, TX (From Diamond Princess)",Province_State != "Unassigned Location (From Diamond Princess)") %>% group_by(Date) %>% summarize(Confirmed = sum(Confirmed),Deaths = sum(Deaths), Recovered = sum(Recovered)) %>% mutate("Province_State" = "US", "Country_Region" = "US") #OLD DATSET CODE; new dataset broken into cities and countries
#Code for Second Version of Dataset until 3/25
#US_virus = virus %>% filter(Country_Region == "United States")%>% group_by(Date) %>% separate(col = Province_State, into = c("City_or_County","State"),sep = ",") %>% filter(is.na(State)== T)%>% summarize(Confirmed = sum(Confirmed),Deaths = sum(Deaths), Recovered = sum(Recovered)) %>% mutate("Province_State" = "United States", "Country_Region" = "United States")
US_virus = virus %>% filter(Country_Region == "United States")%>% group_by(Date) %>% separate(col = Province_State, into = c("City_or_County","State"),sep = ",") %>% filter(is.na(State)== T)%>% summarize(Confirmed = sum(Confirmed),Deaths = sum(Deaths)) %>% mutate("Province_State" = "United States", "Country_Region" = "United States")
No_US_virus = virus %>% filter(Country_Region != "United States",Country_Region != "China",Country_Region != "Australia",Country_Region != "Canada")
country_virus = full_join(No_US_virus, US_virus)
Joining, by = c("Province_State", "Country_Region", "Date", "Confirmed", "Deaths")
country_virus %>% filter(Country_Region == "United States")
#For China
China_virus = virus %>% filter(Country_Region == "China") %>% group_by(Date) %>% summarize(Confirmed = sum(Confirmed),Deaths = sum(Deaths)) %>% mutate("Province_State" = "China", "Country_Region" = "China")
No_China_virus = virus %>% filter(Country_Region != "China", Country_Region != "United States",Country_Region != "Australia",Country_Region != "Canada")
country_virus1 = full_join(No_China_virus, China_virus)
Joining, by = c("Province_State", "Country_Region", "Date", "Confirmed", "Deaths")
#For Canada
Canada_virus = virus %>% filter(Country_Region == "Canada") %>% group_by(Date) %>% summarize(Confirmed = sum(Confirmed),Deaths = sum(Deaths)) %>% mutate("Province_State" = "Canada", "Country_Region" = "Canada")
No_Canada_virus = virus %>% filter(Country_Region != "China", Country_Region != "United States",Country_Region != "Australia", Country_Region != "Canada")
country_virus11 = full_join(No_Canada_virus, Canada_virus)
Joining, by = c("Province_State", "Country_Region", "Date", "Confirmed", "Deaths")
#For Australia
Australia_virus = virus %>% filter(Country_Region == "Australia")%>% group_by(Date) %>% summarize(Confirmed = sum(Confirmed),Deaths = sum(Deaths)) %>% mutate("Province_State" = "Australia", "Country_Region" = "Australia")
No_Australia_virus = virus %>% filter(Country_Region != "Australia", Country_Region != "United States",Country_Region != "China", Country_Region != "Canada")
country_virus2 = full_join(No_Australia_virus, Australia_virus)
Joining, by = c("Province_State", "Country_Region", "Date", "Confirmed", "Deaths")
predata = full_join(country_virus,country_virus1)
Joining, by = c("Province_State", "Country_Region", "Lat", "Long", "Date", "Confirmed", "Deaths", "Recovered")
mydata = full_join(predata,country_virus2)
Joining, by = c("Province_State", "Country_Region", "Lat", "Long", "Date", "Confirmed", "Deaths", "Recovered")
mydata2 = full_join(mydata,country_virus11)
Joining, by = c("Province_State", "Country_Region", "Lat", "Long", "Date", "Confirmed", "Deaths", "Recovered")
#mydata2 %>% filter(Country_Region == "Canada")
mydata2
#GDPandWeather = GDPandWeather %>% rename("Country_Region"= Country)
GDPandWeather
partialdata = left_join(mydata2,GDPandWeather,by = "Country_Region")
country_population_2 = country_population_1 %>% rename("Country_Region"= Country)
ourfinaldata = left_join(partialdata,country_population_2, by = "Country_Region")
Filter by the previous day to make sure we have the most recent data.
ourfinaldata %>% filter(Date == "2020-04-01")
write_csv(ourfinaldata, "ourfinaldata.csv")
library(lubridate)
Code to Analyze our CSV file
#Formatting the variable date as mdy and ordering it
ourfinaldata$Date <-as.Date(ourfinaldata$Date, format = "%m/%d/%y")
#One Plot of World Deaths
ourfinaldata %>% group_by(Date) %>% summarize(Total = sum(Confirmed), Dead_count = sum(Deaths)) %>% ggplot() + geom_line(aes(x = Date, y = Total,group=1, size = Dead_count)) + ggtitle("World Cases and Deaths Graph 1")

#Another Plot of World Deaths
ourfinaldata %>% group_by(Date) %>% summarize(Total = sum(Confirmed), Dead_count = sum(Deaths)) %>% ggplot() + geom_line(aes(x = Date, y = Total,group = 1), linetype = "dashed") + geom_line(aes(x = Date, y = Dead_count, group = 1), color = "red")+ ggtitle("World Cases and Deaths Graph 1")

#Deaths in China
ourfinaldata %>% filter(Country_Region == "China") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("China Cases and Deaths")

#Deaths in United States
ourfinaldata %>% filter(Country_Region == "United States") %>% group_by(Date) %>% arrange(Date)%>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("United States Cases and Deaths")

#Deaths in South Korea
ourfinaldata %>% filter(Country_Region == "South Korea") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("South Korea Cases and Deaths")

#Deaths in Italy
ourfinaldata %>% filter(Country_Region == "Italy") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Italy Cases and Deaths")

#Deaths in Spain
ourfinaldata %>% filter(Country_Region == "Spain") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Spain Cases and Deaths")

#Deaths in Iran
ourfinaldata %>% filter(Country_Region == "Iran") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Iran Cases and Deaths")

#Deaths in Canada
ourfinaldata %>% filter(Country_Region == "Canada") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Canada Cases and Deaths")

#Deaths in Japan
ourfinaldata %>% filter(Country_Region == "Japan") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Japan Cases and Deaths")

#Deaths in Costa Rica
ourfinaldata %>% filter(Country_Region == "Costa Rica") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Costa Rica Cases and Deaths")

#Deaths in Germany
ourfinaldata %>% filter(Country_Region == "Germany") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Germany Cases and Deaths")

#Deaths in United Kingdom
ourfinaldata %>% filter(Country_Region == "United Kingdom"& is.na(Province_State)) %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("United Kingdom Cases and Deaths")

#Deaths in France
ourfinaldata %>% filter(Country_Region == "France" & is.na(Province_State)) %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("France Cases and Deaths")

#Russia
ourfinaldata %>% filter(Country_Region == "Russia") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Russia Cases and Deaths")

#Egypt
ourfinaldata %>% filter(Country_Region == "Egypt") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Egypt Cases and Deaths")

#South Africa
ourfinaldata %>% filter(Country_Region == "South Africa") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("South Africa Cases and Deaths")

#Finlad
ourfinaldata %>% filter(Country_Region == "Finland") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Finland Cases and Deaths")

#Austria
ourfinaldata %>% filter(Country_Region == "Austria") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Austria Cases and Deaths")

#Portugal
ourfinaldata %>% filter(Country_Region == "Portugal") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Portugal Cases and Deaths")

#Indonesia
ourfinaldata %>% filter(Country_Region == "Indonesia") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Indonesia Cases and Deaths")

#Australia
ourfinaldata %>% filter(Country_Region == "Australia") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Australia Cases and Deaths")

#Mexico
ourfinaldata %>% filter(Country_Region == "Mexico") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Mexico Cases and Deaths")

#Serbia
ourfinaldata %>% filter(Country_Region == "Serbia") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Serbia Cases and Deaths")

#Iceland
ourfinaldata %>% filter(Country_Region == "Iceland") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Iceland Cases and Deaths")

#Afghanistan
ourfinaldata %>% filter(Country_Region == "Afghanistan") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Afghanistan Cases and Deaths")

#Norway
ourfinaldata %>% filter(Country_Region == "Norway") %>% group_by(Date) %>% ggplot() + geom_line(aes(x = Date, y = Confirmed,group =1), linetype = "dashed") + geom_line(aes(x = Date, y = Deaths,group =1), color = "red")+ ggtitle("Norway Cases and Deaths")

#Comparison of Total Cases in each country
ourfinaldata %>% filter(Country_Region == "United States"|Country_Region == "Italy"|Country_Region=="China"|Country_Region == "Spain"|Country_Region == "Iran"|Country_Region == "Australia"|Country_Region == "South Korea") %>% ggplot(mapping = aes(x=Date,y = Confirmed, color = Country_Region))+geom_line() +ggtitle("Total Confirmed Cases Over Time")

ourfinaldata %>% filter(Country_Region == "United States"|Country_Region == "Italy"|Country_Region=="China"|Country_Region == "Spain"|Country_Region == "Iran"|Country_Region == "Australia"|Country_Region == "South Korea") %>% ggplot(mapping = aes(x=Date,y = Deaths, color = Country_Region))+geom_line() +ggtitle("Total Confirmed Deaths Over Time")

Plots of the Percentage of Population Infected
#Note the y-axis for these graphs should be 0-100 because calculated as a percent but this shows how few people have it at this point
#USA
ourfinaldata %>%filter(Country_Region == "United States") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in the USA")

#China
ourfinaldata %>%filter(Country_Region == "China") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in China")

#Italy
ourfinaldata %>%filter(Country_Region == "Italy") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in Italy")

#Spain
ourfinaldata %>%filter(Country_Region == "Spain") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in Spain")

#India
ourfinaldata %>%filter(Country_Region == "India") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in India")

#Iran
ourfinaldata %>%filter(Country_Region == "Iran") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in Iran")

#South Africa
ourfinaldata %>%filter(Country_Region == "South Africa") %>%group_by(Date)%>% summarize(Total = sum(Confirmed),Pop = Population_2020) %>% mutate("Percent_Infected" = (Total/Pop)*100) %>% ggplot()+geom_line(mapping = aes(x = Date, y = Percent_Infected)) + ylim(0,1) +ggtitle("Percentange of People Infected in South Africa")

LS0tCnRpdGxlOiAiQ29yb25vdmlydXNfRmluYWxQcm9qZWN0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpQb3B1bGF0aW9uCkdEUApBdmcgVGVtcGVyYXR1cmUKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShhbmNob3JzKQpsaWJyYXJ5KG1vZGVybmRpdmUpCmBgYAoKI0NvZGUgdG8gU2V0IFVwIG91ciBDU1YgZmlsZQpUaGUgY29kZSBpbiB0aGlzIGNodW5rIGJlbG93IHN1bXMgdXAgYWxsIHRoZSBjYXNlcyBmb3IgY291bnRyaWVzIHRoYXQgYXJlIGJyb2tlbiBpbnRvIHJlZ2lvbnMgc28gd2UgY2FuIGhhdmUgb25lIHZhbHVlIHBlciByb3cgZm9yIHRob3NlIGNvdW50cmllcy4gIFdlIGhhZCB0byBkbyB0aGlzIGZvciB0aGUgVVMsIENoaW5hLCBhbmQgQXVzdHJhbGlhLgpgYGB7cn0KdmlydXMgPSByZWFkX2NzdigiY292aWRfMTlfY2xlYW5fY29tcGxldGUuY3N2IikKdmlydXMgPC0gcmVwbGFjZS52YWx1ZSh2aXJ1cywiQ291bnRyeV9SZWdpb24iLGZyb20gPSAiVVMiLHRvID0gIlVuaXRlZCBTdGF0ZXMiKSAjUmVwbGFjaW5nIHZhbHVlIG9mIFVTIHdpdGggdmFsdWUgVW5pdGVkIFN0YXRlcwoKI1VTX3ZpcnVzIGlzIHRoZSBkYXRhIHdpdGggdGhlIGNydWlzZSBzaGlwcyBmaWx0ZXJlZCBvdXQgYW5kIHN1bXMgdXAgYWxsIHRoZSBjYXNlcyBpbiBlYWNoIGNvdW50eSBhbmQgY29tYmluZXMgdGhlbSBpbnRvIGEgdG90YWwgbnVtYmVyIG9mIGNhc2VzIGdyb3VwZWQgYnkgZGF0ZQojTm9fVVNfdmlydXMgaXMgdGhlIGRhdGEgd2l0aG91dCB0aGUgVVMgYW5kIGlzIGp1c3QgZm9yIGFsbCB0aGUgb3RoZXIgY291bnRyaWVzCiNjb3VudHJ5X3ZpcnVzIGlzIHRoZSBmaW5hbCBkYXRhc2V0IGdyb3VwZWQgYnkgY291bnRyeQoKCiNVU192aXJ1cyA9IHZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVTIikgJT4lIGZpbHRlcihQcm92aW5jZV9TdGF0ZSAhPSAiR3JhbmQgUHJpbmNlc3MgQ3J1aXNlIFNoaXAiLFByb3ZpbmNlX1N0YXRlICE9ICJPbWFoYSwgTkUgKEZyb20gRGlhbW9uZCBQcmluY2VzcykiLFByb3ZpbmNlX1N0YXRlICE9ICJUcmF2aXMsIENBIChGcm9tIERpYW1vbmQgUHJpbmNlc3MpIixQcm92aW5jZV9TdGF0ZSAhPSAiTGFja2xhbmQsIFRYIChGcm9tIERpYW1vbmQgUHJpbmNlc3MpIixQcm92aW5jZV9TdGF0ZSAhPSAiVW5hc3NpZ25lZCBMb2NhdGlvbiAoRnJvbSBEaWFtb25kIFByaW5jZXNzKSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgc3VtbWFyaXplKENvbmZpcm1lZCA9IHN1bShDb25maXJtZWQpLERlYXRocyA9IHN1bShEZWF0aHMpLCBSZWNvdmVyZWQgPSBzdW0oUmVjb3ZlcmVkKSkgJT4lIG11dGF0ZSgiUHJvdmluY2VfU3RhdGUiID0gIlVTIiwgIkNvdW50cnlfUmVnaW9uIiA9ICJVUyIpICNPTEQgREFUU0VUIENPREU7IG5ldyBkYXRhc2V0IGJyb2tlbiBpbnRvIGNpdGllcyBhbmQgY291bnRyaWVzCgojQ29kZSBmb3IgU2Vjb25kIFZlcnNpb24gb2YgRGF0YXNldCB1bnRpbCAzLzI1CiNVU192aXJ1cyA9IHZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMiKSU+JSBncm91cF9ieShEYXRlKSAlPiUgc2VwYXJhdGUoY29sID0gUHJvdmluY2VfU3RhdGUsIGludG8gPSBjKCJDaXR5X29yX0NvdW50eSIsIlN0YXRlIiksc2VwID0gIiwiKSAlPiUgZmlsdGVyKGlzLm5hKFN0YXRlKT09IFQpJT4lIHN1bW1hcml6ZShDb25maXJtZWQgPSBzdW0oQ29uZmlybWVkKSxEZWF0aHMgPSBzdW0oRGVhdGhzKSwgUmVjb3ZlcmVkID0gc3VtKFJlY292ZXJlZCkpICU+JSBtdXRhdGUoIlByb3ZpbmNlX1N0YXRlIiA9ICJVbml0ZWQgU3RhdGVzIiwgIkNvdW50cnlfUmVnaW9uIiA9ICJVbml0ZWQgU3RhdGVzIikKVVNfdmlydXMgPSB2aXJ1cyAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJVbml0ZWQgU3RhdGVzIiklPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lIHNlcGFyYXRlKGNvbCA9IFByb3ZpbmNlX1N0YXRlLCBpbnRvID0gYygiQ2l0eV9vcl9Db3VudHkiLCJTdGF0ZSIpLHNlcCA9ICIsIikgJT4lIGZpbHRlcihpcy5uYShTdGF0ZSk9PSBUKSU+JSBzdW1tYXJpemUoQ29uZmlybWVkID0gc3VtKENvbmZpcm1lZCksRGVhdGhzID0gc3VtKERlYXRocykpICU+JSBtdXRhdGUoIlByb3ZpbmNlX1N0YXRlIiA9ICJVbml0ZWQgU3RhdGVzIiwgIkNvdW50cnlfUmVnaW9uIiA9ICJVbml0ZWQgU3RhdGVzIikKCk5vX1VTX3ZpcnVzID0gdmlydXMgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiAhPSAiVW5pdGVkIFN0YXRlcyIsQ291bnRyeV9SZWdpb24gIT0gIkNoaW5hIixDb3VudHJ5X1JlZ2lvbiAhPSAiQXVzdHJhbGlhIixDb3VudHJ5X1JlZ2lvbiAhPSAiQ2FuYWRhIikKCmNvdW50cnlfdmlydXMgPSBmdWxsX2pvaW4oTm9fVVNfdmlydXMsIFVTX3ZpcnVzKQpjb3VudHJ5X3ZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMiKQoKI0ZvciBDaGluYQpDaGluYV92aXJ1cyA9IHZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkNoaW5hIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSBzdW1tYXJpemUoQ29uZmlybWVkID0gc3VtKENvbmZpcm1lZCksRGVhdGhzID0gc3VtKERlYXRocykpICU+JSBtdXRhdGUoIlByb3ZpbmNlX1N0YXRlIiA9ICJDaGluYSIsICJDb3VudHJ5X1JlZ2lvbiIgPSAiQ2hpbmEiKQpOb19DaGluYV92aXJ1cyA9IHZpcnVzICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gIT0gIkNoaW5hIiwgQ291bnRyeV9SZWdpb24gIT0gIlVuaXRlZCBTdGF0ZXMiLENvdW50cnlfUmVnaW9uICE9ICJBdXN0cmFsaWEiLENvdW50cnlfUmVnaW9uICE9ICJDYW5hZGEiKQpjb3VudHJ5X3ZpcnVzMSA9IGZ1bGxfam9pbihOb19DaGluYV92aXJ1cywgQ2hpbmFfdmlydXMpCgojRm9yIENhbmFkYQpDYW5hZGFfdmlydXMgPSB2aXJ1cyAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJDYW5hZGEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lIHN1bW1hcml6ZShDb25maXJtZWQgPSBzdW0oQ29uZmlybWVkKSxEZWF0aHMgPSBzdW0oRGVhdGhzKSkgJT4lIG11dGF0ZSgiUHJvdmluY2VfU3RhdGUiID0gIkNhbmFkYSIsICJDb3VudHJ5X1JlZ2lvbiIgPSAiQ2FuYWRhIikKTm9fQ2FuYWRhX3ZpcnVzID0gdmlydXMgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiAhPSAiQ2hpbmEiLCBDb3VudHJ5X1JlZ2lvbiAhPSAiVW5pdGVkIFN0YXRlcyIsQ291bnRyeV9SZWdpb24gIT0gIkF1c3RyYWxpYSIsIENvdW50cnlfUmVnaW9uICE9ICJDYW5hZGEiKQpjb3VudHJ5X3ZpcnVzMTEgPSBmdWxsX2pvaW4oTm9fQ2FuYWRhX3ZpcnVzLCBDYW5hZGFfdmlydXMpCgojRm9yIEF1c3RyYWxpYQpBdXN0cmFsaWFfdmlydXMgPSB2aXJ1cyAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJBdXN0cmFsaWEiKSU+JSBncm91cF9ieShEYXRlKSAlPiUgc3VtbWFyaXplKENvbmZpcm1lZCA9IHN1bShDb25maXJtZWQpLERlYXRocyA9IHN1bShEZWF0aHMpKSAlPiUgbXV0YXRlKCJQcm92aW5jZV9TdGF0ZSIgPSAiQXVzdHJhbGlhIiwgIkNvdW50cnlfUmVnaW9uIiA9ICJBdXN0cmFsaWEiKQpOb19BdXN0cmFsaWFfdmlydXMgPSB2aXJ1cyAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uICE9ICJBdXN0cmFsaWEiLCBDb3VudHJ5X1JlZ2lvbiAhPSAiVW5pdGVkIFN0YXRlcyIsQ291bnRyeV9SZWdpb24gIT0gIkNoaW5hIiwgQ291bnRyeV9SZWdpb24gIT0gIkNhbmFkYSIpCmNvdW50cnlfdmlydXMyID0gZnVsbF9qb2luKE5vX0F1c3RyYWxpYV92aXJ1cywgQXVzdHJhbGlhX3ZpcnVzKQoKcHJlZGF0YSA9IGZ1bGxfam9pbihjb3VudHJ5X3ZpcnVzLGNvdW50cnlfdmlydXMxKQpteWRhdGEgPSBmdWxsX2pvaW4ocHJlZGF0YSxjb3VudHJ5X3ZpcnVzMikKbXlkYXRhMiA9IGZ1bGxfam9pbihteWRhdGEsY291bnRyeV92aXJ1czExKQojbXlkYXRhMiAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJDYW5hZGEiKQpgYGAKCmBgYHtyfQpteWRhdGEyCiNHRFBhbmRXZWF0aGVyID0gR0RQYW5kV2VhdGhlciAlPiUgcmVuYW1lKCJDb3VudHJ5X1JlZ2lvbiI9IENvdW50cnkpCkdEUGFuZFdlYXRoZXIKcGFydGlhbGRhdGEgPSBsZWZ0X2pvaW4obXlkYXRhMixHRFBhbmRXZWF0aGVyLGJ5ID0gIkNvdW50cnlfUmVnaW9uIikKY291bnRyeV9wb3B1bGF0aW9uXzIgPSBjb3VudHJ5X3BvcHVsYXRpb25fMSAlPiUgcmVuYW1lKCJDb3VudHJ5X1JlZ2lvbiI9IENvdW50cnkpCm91cmZpbmFsZGF0YSA9IGxlZnRfam9pbihwYXJ0aWFsZGF0YSxjb3VudHJ5X3BvcHVsYXRpb25fMiwgYnkgPSAiQ291bnRyeV9SZWdpb24iKQoKYGBgCgpGaWx0ZXIgYnkgdGhlIHByZXZpb3VzIGRheSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbW9zdCByZWNlbnQgZGF0YS4KYGBge3J9Cm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKERhdGUgPT0gIjIwMjAtMDQtMDEiKQpgYGAKCgpgYGB7cn0Kd3JpdGVfY3N2KG91cmZpbmFsZGF0YSwgIm91cmZpbmFsZGF0YS5jc3YiKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKYGBgCgojQ29kZSB0byBBbmFseXplIG91ciBDU1YgZmlsZQoKYGBge3J9CiNGb3JtYXR0aW5nIHRoZSB2YXJpYWJsZSBkYXRlIGFzIG1keSBhbmQgb3JkZXJpbmcgaXQKb3VyZmluYWxkYXRhJERhdGUgPC1hcy5EYXRlKG91cmZpbmFsZGF0YSREYXRlLCBmb3JtYXQgPSAiJW0vJWQvJXkiKQojT25lIFBsb3Qgb2YgV29ybGQgRGVhdGhzCm91cmZpbmFsZGF0YSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lIHN1bW1hcml6ZShUb3RhbCA9IHN1bShDb25maXJtZWQpLCBEZWFkX2NvdW50ID0gc3VtKERlYXRocykpICU+JSBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBUb3RhbCxncm91cD0xLCBzaXplID0gRGVhZF9jb3VudCkpICsgIGdndGl0bGUoIldvcmxkIENhc2VzIGFuZCBEZWF0aHMgR3JhcGggMSIpCgojQW5vdGhlciBQbG90IG9mIFdvcmxkIERlYXRocwpvdXJmaW5hbGRhdGEgJT4lIGdyb3VwX2J5KERhdGUpICU+JSBzdW1tYXJpemUoVG90YWwgPSBzdW0oQ29uZmlybWVkKSwgRGVhZF9jb3VudCA9IHN1bShEZWF0aHMpKSAlPiUgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gVG90YWwsZ3JvdXAgPSAxKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYWRfY291bnQsIGdyb3VwID0gMSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJXb3JsZCBDYXNlcyBhbmQgRGVhdGhzIEdyYXBoIDEiKQoKI0RlYXRocyBpbiBDaGluYQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiQ2hpbmEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkNoaW5hIENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBVbml0ZWQgU3RhdGVzCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJVbml0ZWQgU3RhdGVzIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSBhcnJhbmdlKERhdGUpJT4lIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiVW5pdGVkIFN0YXRlcyBDYXNlcyBhbmQgRGVhdGhzIikKCiNEZWF0aHMgaW4gU291dGggS29yZWEKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlNvdXRoIEtvcmVhIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJTb3V0aCBLb3JlYSBDYXNlcyBhbmQgRGVhdGhzIikKCiNEZWF0aHMgaW4gSXRhbHkKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkl0YWx5IikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJJdGFseSBDYXNlcyBhbmQgRGVhdGhzIikKCiNEZWF0aHMgaW4gU3BhaW4Kb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlNwYWluIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJTcGFpbiBDYXNlcyBhbmQgRGVhdGhzIikKCiNEZWF0aHMgaW4gSXJhbgpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiSXJhbiIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiSXJhbiBDYXNlcyBhbmQgRGVhdGhzIikKYGBgCgpgYGB7cn0KI0RlYXRocyBpbiBDYW5hZGEKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkNhbmFkYSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiQ2FuYWRhIENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBKYXBhbgpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiSmFwYW4iKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkphcGFuIENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBDb3N0YSBSaWNhCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJDb3N0YSBSaWNhIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJDb3N0YSBSaWNhIENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBHZXJtYW55Cm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJHZXJtYW55IikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJHZXJtYW55IENhc2VzIGFuZCBEZWF0aHMiKQoKI0RlYXRocyBpbiBVbml0ZWQgS2luZ2RvbQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiVW5pdGVkIEtpbmdkb20iJiBpcy5uYShQcm92aW5jZV9TdGF0ZSkpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiVW5pdGVkIEtpbmdkb20gQ2FzZXMgYW5kIERlYXRocyIpCgojRGVhdGhzIGluIEZyYW5jZQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiRnJhbmNlIiAmIGlzLm5hKFByb3ZpbmNlX1N0YXRlKSkgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJGcmFuY2UgQ2FzZXMgYW5kIERlYXRocyIpCgojUnVzc2lhCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJSdXNzaWEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIlJ1c3NpYSBDYXNlcyBhbmQgRGVhdGhzIikKCiNFZ3lwdApvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiRWd5cHQiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkVneXB0IENhc2VzIGFuZCBEZWF0aHMiKQoKI1NvdXRoIEFmcmljYQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiU291dGggQWZyaWNhIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJTb3V0aCBBZnJpY2EgQ2FzZXMgYW5kIERlYXRocyIpCmBgYAoKCmBgYHtyfQojRmlubGFkCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJGaW5sYW5kIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJGaW5sYW5kIENhc2VzIGFuZCBEZWF0aHMiKQoKI0F1c3RyaWEKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkF1c3RyaWEiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkF1c3RyaWEgQ2FzZXMgYW5kIERlYXRocyIpCgojUG9ydHVnYWwKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlBvcnR1Z2FsIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJQb3J0dWdhbCBDYXNlcyBhbmQgRGVhdGhzIikKCiNJbmRvbmVzaWEKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkluZG9uZXNpYSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiSW5kb25lc2lhIENhc2VzIGFuZCBEZWF0aHMiKQoKI0F1c3RyYWxpYQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiQXVzdHJhbGlhIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJBdXN0cmFsaWEgQ2FzZXMgYW5kIERlYXRocyIpCgojTWV4aWNvCm91cmZpbmFsZGF0YSAlPiUgZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJNZXhpY28iKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIk1leGljbyBDYXNlcyBhbmQgRGVhdGhzIikKCmBgYAoKYGBge3J9CiNTZXJiaWEKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlNlcmJpYSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiU2VyYmlhIENhc2VzIGFuZCBEZWF0aHMiKQoKI0ljZWxhbmQKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkljZWxhbmQiKSAlPiUgZ3JvdXBfYnkoRGF0ZSkgJT4lICBnZ3Bsb3QoKSArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBDb25maXJtZWQsZ3JvdXAgPTEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSAgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gRGVhdGhzLGdyb3VwID0xKSwgY29sb3IgPSAicmVkIikrIGdndGl0bGUoIkljZWxhbmQgQ2FzZXMgYW5kIERlYXRocyIpCgojQWZnaGFuaXN0YW4Kb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkFmZ2hhbmlzdGFuIikgJT4lIGdyb3VwX2J5KERhdGUpICU+JSAgZ2dwbG90KCkgKyBnZW9tX2xpbmUoYWVzKHggPSBEYXRlLCB5ID0gQ29uZmlybWVkLGdyb3VwID0xKSwgbGluZXR5cGUgPSAiZGFzaGVkIikgICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IERlYXRocyxncm91cCA9MSksIGNvbG9yID0gInJlZCIpKyBnZ3RpdGxlKCJBZmdoYW5pc3RhbiBDYXNlcyBhbmQgRGVhdGhzIikKCiNOb3J3YXkKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIk5vcndheSIpICU+JSBncm91cF9ieShEYXRlKSAlPiUgIGdncGxvdCgpICsgZ2VvbV9saW5lKGFlcyh4ID0gRGF0ZSwgeSA9IENvbmZpcm1lZCxncm91cCA9MSksIGxpbmV0eXBlID0gImRhc2hlZCIpICArIGdlb21fbGluZShhZXMoeCA9IERhdGUsIHkgPSBEZWF0aHMsZ3JvdXAgPTEpLCBjb2xvciA9ICJyZWQiKSsgZ2d0aXRsZSgiTm9yd2F5IENhc2VzIGFuZCBEZWF0aHMiKQpgYGAKCmBgYHtyfQojQ29tcGFyaXNvbiBvZiBUb3RhbCBDYXNlcyBpbiBlYWNoIGNvdW50cnkKb3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMifENvdW50cnlfUmVnaW9uID09ICJJdGFseSJ8Q291bnRyeV9SZWdpb249PSJDaGluYSJ8Q291bnRyeV9SZWdpb24gPT0gIlNwYWluInxDb3VudHJ5X1JlZ2lvbiA9PSAiSXJhbiJ8Q291bnRyeV9SZWdpb24gPT0gIkF1c3RyYWxpYSJ8Q291bnRyeV9SZWdpb24gPT0gIlNvdXRoIEtvcmVhIikgJT4lIGdncGxvdChtYXBwaW5nID0gYWVzKHg9RGF0ZSx5ID0gQ29uZmlybWVkLCBjb2xvciA9IENvdW50cnlfUmVnaW9uKSkrZ2VvbV9saW5lKCkgK2dndGl0bGUoIlRvdGFsIENvbmZpcm1lZCBDYXNlcyBPdmVyIFRpbWUiKQpvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiVW5pdGVkIFN0YXRlcyJ8Q291bnRyeV9SZWdpb24gPT0gIkl0YWx5InxDb3VudHJ5X1JlZ2lvbj09IkNoaW5hInxDb3VudHJ5X1JlZ2lvbiA9PSAiU3BhaW4ifENvdW50cnlfUmVnaW9uID09ICJJcmFuInxDb3VudHJ5X1JlZ2lvbiA9PSAiQXVzdHJhbGlhInxDb3VudHJ5X1JlZ2lvbiA9PSAiU291dGggS29yZWEiKSAlPiUgZ2dwbG90KG1hcHBpbmcgPSBhZXMoeD1EYXRlLHkgPSBEZWF0aHMsIGNvbG9yID0gQ291bnRyeV9SZWdpb24pKStnZW9tX2xpbmUoKSArZ2d0aXRsZSgiVG90YWwgQ29uZmlybWVkIERlYXRocyBPdmVyIFRpbWUiKQpgYGAKCgoKUGxvdHMgb2YgdGhlIFBlcmNlbnRhZ2Ugb2YgUG9wdWxhdGlvbiBJbmZlY3RlZApgYGB7cn0KCiNOb3RlIHRoZSB5LWF4aXMgZm9yIHRoZXNlIGdyYXBocyBzaG91bGQgYmUgMC0xMDAgYmVjYXVzZSBjYWxjdWxhdGVkIGFzIGEgcGVyY2VudCBidXQgdGhpcyBzaG93cyBob3cgZmV3IHBlb3BsZSBoYXZlIGl0IGF0IHRoaXMgcG9pbnQKI1VTQQpvdXJmaW5hbGRhdGEgJT4lZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJVbml0ZWQgU3RhdGVzIikgJT4lZ3JvdXBfYnkoRGF0ZSklPiUgc3VtbWFyaXplKFRvdGFsID0gc3VtKENvbmZpcm1lZCksUG9wID0gUG9wdWxhdGlvbl8yMDIwKSAlPiUgbXV0YXRlKCJQZXJjZW50X0luZmVjdGVkIiA9IChUb3RhbC9Qb3ApKjEwMCkgJT4lIGdncGxvdCgpK2dlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSBEYXRlLCB5ID0gUGVyY2VudF9JbmZlY3RlZCkpICsgeWxpbSgwLDEpICtnZ3RpdGxlKCJQZXJjZW50YW5nZSBvZiBQZW9wbGUgSW5mZWN0ZWQgaW4gdGhlIFVTQSIpCgojQ2hpbmEKb3VyZmluYWxkYXRhICU+JWZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiQ2hpbmEiKSAlPiVncm91cF9ieShEYXRlKSU+JSBzdW1tYXJpemUoVG90YWwgPSBzdW0oQ29uZmlybWVkKSxQb3AgPSBQb3B1bGF0aW9uXzIwMjApICU+JSBtdXRhdGUoIlBlcmNlbnRfSW5mZWN0ZWQiID0gKFRvdGFsL1BvcCkqMTAwKSAlPiUgZ2dwbG90KCkrZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IERhdGUsIHkgPSBQZXJjZW50X0luZmVjdGVkKSkgKyB5bGltKDAsMSkgK2dndGl0bGUoIlBlcmNlbnRhbmdlIG9mIFBlb3BsZSBJbmZlY3RlZCBpbiBDaGluYSIpCgojSXRhbHkKb3VyZmluYWxkYXRhICU+JWZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiSXRhbHkiKSAlPiVncm91cF9ieShEYXRlKSU+JSBzdW1tYXJpemUoVG90YWwgPSBzdW0oQ29uZmlybWVkKSxQb3AgPSBQb3B1bGF0aW9uXzIwMjApICU+JSBtdXRhdGUoIlBlcmNlbnRfSW5mZWN0ZWQiID0gKFRvdGFsL1BvcCkqMTAwKSAlPiUgZ2dwbG90KCkrZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IERhdGUsIHkgPSBQZXJjZW50X0luZmVjdGVkKSkgKyB5bGltKDAsMSkgK2dndGl0bGUoIlBlcmNlbnRhbmdlIG9mIFBlb3BsZSBJbmZlY3RlZCBpbiBJdGFseSIpCgojU3BhaW4Kb3VyZmluYWxkYXRhICU+JWZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiU3BhaW4iKSAlPiVncm91cF9ieShEYXRlKSU+JSBzdW1tYXJpemUoVG90YWwgPSBzdW0oQ29uZmlybWVkKSxQb3AgPSBQb3B1bGF0aW9uXzIwMjApICU+JSBtdXRhdGUoIlBlcmNlbnRfSW5mZWN0ZWQiID0gKFRvdGFsL1BvcCkqMTAwKSAlPiUgZ2dwbG90KCkrZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IERhdGUsIHkgPSBQZXJjZW50X0luZmVjdGVkKSkgKyB5bGltKDAsMSkgK2dndGl0bGUoIlBlcmNlbnRhbmdlIG9mIFBlb3BsZSBJbmZlY3RlZCBpbiBTcGFpbiIpCgojSW5kaWEKb3VyZmluYWxkYXRhICU+JWZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiSW5kaWEiKSAlPiVncm91cF9ieShEYXRlKSU+JSBzdW1tYXJpemUoVG90YWwgPSBzdW0oQ29uZmlybWVkKSxQb3AgPSBQb3B1bGF0aW9uXzIwMjApICU+JSBtdXRhdGUoIlBlcmNlbnRfSW5mZWN0ZWQiID0gKFRvdGFsL1BvcCkqMTAwKSAlPiUgZ2dwbG90KCkrZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IERhdGUsIHkgPSBQZXJjZW50X0luZmVjdGVkKSkgKyB5bGltKDAsMSkgK2dndGl0bGUoIlBlcmNlbnRhbmdlIG9mIFBlb3BsZSBJbmZlY3RlZCBpbiBJbmRpYSIpCgojSXJhbgpvdXJmaW5hbGRhdGEgJT4lZmlsdGVyKENvdW50cnlfUmVnaW9uID09ICJJcmFuIikgJT4lZ3JvdXBfYnkoRGF0ZSklPiUgc3VtbWFyaXplKFRvdGFsID0gc3VtKENvbmZpcm1lZCksUG9wID0gUG9wdWxhdGlvbl8yMDIwKSAlPiUgbXV0YXRlKCJQZXJjZW50X0luZmVjdGVkIiA9IChUb3RhbC9Qb3ApKjEwMCkgJT4lIGdncGxvdCgpK2dlb21fbGluZShtYXBwaW5nID0gYWVzKHggPSBEYXRlLCB5ID0gUGVyY2VudF9JbmZlY3RlZCkpICsgeWxpbSgwLDEpICtnZ3RpdGxlKCJQZXJjZW50YW5nZSBvZiBQZW9wbGUgSW5mZWN0ZWQgaW4gSXJhbiIpCgojU291dGggQWZyaWNhCm91cmZpbmFsZGF0YSAlPiVmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlNvdXRoIEFmcmljYSIpICU+JWdyb3VwX2J5KERhdGUpJT4lIHN1bW1hcml6ZShUb3RhbCA9IHN1bShDb25maXJtZWQpLFBvcCA9IFBvcHVsYXRpb25fMjAyMCkgJT4lIG11dGF0ZSgiUGVyY2VudF9JbmZlY3RlZCIgPSAoVG90YWwvUG9wKSoxMDApICU+JSBnZ3Bsb3QoKStnZW9tX2xpbmUobWFwcGluZyA9IGFlcyh4ID0gRGF0ZSwgeSA9IFBlcmNlbnRfSW5mZWN0ZWQpKSArIHlsaW0oMCwxKSArZ2d0aXRsZSgiUGVyY2VudGFuZ2Ugb2YgUGVvcGxlIEluZmVjdGVkIGluIFNvdXRoIEFmcmljYSIpCmBgYAoKCiNMb2dpc3RpYyBHcm93dGggZm9yIEl0YWx5CmBgYHtyfQpudW1fZGF5c19JdGFseSA9IG5yb3cob3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIkl0YWx5IixDb25maXJtZWQgPjMpKQpJdGFseV9kYXQgPSBvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiSXRhbHkiLENvbmZpcm1lZCA+MykgJT4lIG11dGF0ZSgiTnVtX0RheXNfU2luY2VfU3RhcnQiPWMoMTpudW1fZGF5c19JdGFseSkpCgojVXNpbmcgTm9ubGluZWFyIExlYXN0IFNxdWFyZXMgTG9naXN0aWMgR3Jvd3RoIE1vZGVsCkl0YWx5X21vZCA9IG5scyhDb25maXJtZWQgfiAgYy8oMSthKmV4cChiKk51bV9EYXlzX1NpbmNlX1N0YXJ0KSksIHN0YXJ0ID0gbGlzdChhPTM2Ny4xNywgYiA9IC0wLjE5NTM5OSwgYyA9IDEyMDM5NS4xNDc4KSwgZGF0YSA9IEl0YWx5X2RhdCkKY29lZihzdW1tYXJ5KEl0YWx5X21vZCkpCgpgYGAKCiNMb2dpc3RpYyBHcm93dGggZm9yIFVuaXRlZCBTdGF0ZXMKYGBge3J9Cm51bV9kYXlzX1VTQSA9IG5yb3cob3VyZmluYWxkYXRhICU+JSBmaWx0ZXIoQ291bnRyeV9SZWdpb24gPT0gIlVuaXRlZCBTdGF0ZXMiLENvbmZpcm1lZCA+MykpClVTQV9kYXQgPSBvdXJmaW5hbGRhdGEgJT4lIGZpbHRlcihDb3VudHJ5X1JlZ2lvbiA9PSAiVW5pdGVkIFN0YXRlcyIsQ29uZmlybWVkID4zKSAlPiUgbXV0YXRlKCJOdW1fRGF5c19TaW5jZV9TdGFydCI9YygxOm51bV9kYXlzX1VTQSkpCgojVXNpbmcgTm9ubGluZWFyIExlYXN0IFNxdWFyZXMgTG9naXN0aWMgR3Jvd3RoIE1vZGVsClVTQV9tb2QgPSBubHMoQ29uZmlybWVkIH4gIGMvKDErYSpleHAoYipOdW1fRGF5c19TaW5jZV9TdGFydCkpLCBzdGFydCA9IGxpc3QoYT0yOTA2Ni4yMSwgYiA9IC0wLjI3NywgYyA9IDMzMjIyOS4zKSwgZGF0YSA9IFVTQV9kYXQpCmNvZWYoc3VtbWFyeShVU0FfbW9kKSkKYGBgCgoKI0NvdW50eS9TdGF0ZSBEYXRhIGZvciBVUwoKYGBge3J9Cm15X2NvdW50aWVzID0gcmVhZF9jc3YoInVzYV9jb3VudHlfd2lzZS5jc3YiKQpteV9jb3VudGllcyREYXRlIDwtYXMuRGF0ZShteV9jb3VudGllcyREYXRlLCBmb3JtYXQgPSAiJW0vJWQvJXkiKQpteV9jb3VudGllcyAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJQZW5uc3lsdmFuaWEiICYgRGF0ZSA9PSAiMjAyMC0wMy0zMCIpCgpteV9jb3VudGllcyAlPiUgZmlsdGVyKFByb3ZpbmNlX1N0YXRlID09ICJQZW5uc3lsdmFuaWEifFByb3ZpbmNlX1N0YXRlID09ICJOZXcgWW9yayJ8UHJvdmluY2VfU3RhdGUgPT0gIk5ldyBKZXJzZXkifFByb3ZpbmNlX1N0YXRlID09ICJEZWxhd2FyZSJ8UHJvdmluY2VfU3RhdGUgPT0gIkNhbGlmb3JuaWEifFByb3ZpbmNlX1N0YXRlID09ICJNaWNoaWdhbiIpICU+JSBncm91cF9ieShEYXRlLFByb3ZpbmNlX1N0YXRlKSAlPiUgc3VtbWFyaXplKHN0YXRlX3RvdGFsID0gc3VtKENvbmZpcm1lZCkpJT4lIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBEYXRlLCB5ID0gc3RhdGVfdG90YWwsY29sb3IgPSBQcm92aW5jZV9TdGF0ZSkpK2dlb21fbGluZSgpK2dndGl0bGUoIkNvbmZpcm1lZCBDYXNlcyBhY3Jvc3MgdGhlIFN0YXRlcyIpCgoKbXlfY291bnRpZXMgJT4lIGZpbHRlcihEYXRlID09ICIyMDIwLTA0LTAyIikgJT4lIGdyb3VwX2J5KFByb3ZpbmNlX1N0YXRlKSAlPiUgc3VtbWFyaXplKHN0YXRlX3RvdGFsID0gc3VtKENvbmZpcm1lZCkpICU+JSB0b3BfbihzdGF0ZV90b3RhbCxuPTIwKSAlPiUgYXJyYW5nZShkZXNjKHN0YXRlX3RvdGFsKSkKCmBgYAoK